home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 26 / AACD 26.iso / AACD / System / XFD / Developer / Sources / ASM / SPv3.a < prev    next >
Encoding:
Text File  |  2001-09-16  |  7.5 KB  |  411 lines

  1. ; SPv3 (SPacker v3 for Atari ST) XFD slave by Kyzer/CSG
  2. ; not based on Mr.Larmer's slave ;)
  3. ;
  4. ; SPv3 crunched data format:
  5. ; ULONG ID: "SPv3"
  6. ; UWORD 0 (always?)
  7. ; UWORD ???? (something to do with decrunch colour?)
  8. ; ULONG packed length, includes header
  9. ; ULONG unpacked length
  10. ;
  11. ; Altair (author of Atomik Packer) says "Thanks to Firehawks who have done
  12. ; a new release of Atomik they have called SpeedPacker 3"
  13. ;(Meow, but it's not identical code)
  14.  
  15.     IFD    TEST
  16.     include    xfdExeHead.a
  17.     ENDC
  18.  
  19.     include    libraries/xfdmaster.i
  20.  
  21. ForeMan    dc.l    $70FF4E75,XFDF_ID    ; id
  22.     dc.w    XFDF_VERSION        ; foreman version
  23.     dcb.w    5,0            ; reserved stuff
  24.     dc.l    SP3data            ; first slave
  25.  
  26. SP3data    dc.l    0
  27.     dc.w    2,39
  28.     dc.l    SP3data_name
  29.     dc.w    XFDPFF_DATA!XFDPFF_RECOGLEN!XFDPFF_USERTARGET,0
  30.     dc.l    SP3data_recog,SP3data_decrunch,SP3data_scan,SP3data_verify
  31.     dc.l    0,18
  32.  
  33. SP3data_recog
  34.     cmp.l    #"SPv3",(a0)+
  35.     bne.s    .fail
  36.     tst.w    (a0)+
  37.     bne.s    .fail
  38.     addq.l    #2,a0
  39.     move.l    (a0)+,d1        ; d1 = packed length
  40.     beq.s    .fail            ; fail if unpacked length = 0
  41.     move.l    (a0)+,d0        ; d0 = unpacked length
  42.     beq.s    .fail            ; fail if unpacked length = 0
  43.     cmp.l    d0,d1
  44.     bhi.s    .fail            ; fail if packed length > unpacked
  45.     move.l    d0,xfdrr_FinalTargetLen(a1)
  46.     addq.l    #8,d0            ; up to 8 bytes overrun
  47.     move.l    d0,xfdrr_MinTargetLen(a1)
  48.     move.l    d1,xfdrr_MinSourceLen(a1)
  49.     moveq    #1,d0            ; return success
  50.     rts
  51. .fail    moveq    #0,d0
  52.     rts
  53.  
  54. SP3data_decrunch
  55.     movem.l    d2-d7/a2-a6,-(sp)
  56.     move.l    a0,a6
  57.     move.l    xfdbi_SourceBuffer(a6),a0
  58.     move.l    xfdbi_UserTargetBuf(a6),a2
  59.     move.l    a2,a1
  60.     move.l    8(a0),d0
  61.     addq.l    #1,d0
  62.     andi.w    #-2,d0
  63. .copy    move.w    (a0)+,(a1)+
  64.     subq.l    #2,d0
  65.     bne.s    .copy
  66.     move.l    a2,a0    
  67.     bsr.s    unpack
  68.     moveq    #1,d0    ; success
  69.     movem.l    (sp)+,d2-d7/a2-a6
  70.     rts
  71.  
  72. SP3data_scan
  73.     moveq   #0,d0
  74.     cmp.l   #"SPv3",(a0)
  75.     bne.s    .fail
  76.     moveq    #1,d0
  77. .fail    rts
  78.  
  79. SP3data_verify
  80.     move.l   8(a0),d1        ; d1 = packed length
  81.     cmp.l   d0,d1
  82.     bhi.s    .fail            ; fail if packed len > remaining len
  83.     cmp.l    12(a0),d1
  84.     bhi.s    .fail            ; fail if packed len > unpacked len
  85.     move.l    d1,d0
  86.     rts
  87. .fail    moveq    #0,d0
  88.     rts
  89.  
  90.  
  91.  
  92.  
  93.  
  94. * UNPACK source for SPACKERv3    (C)THE FIREHAWKS'92
  95. * -------------------------------------------------
  96. * in    a0: even address start packed block
  97. * out    d0: original length or 0 if not SPv3 packed
  98. * =================================================
  99. * Use AUTO_SP3.PRG for multiblk packed files
  100.  
  101. sp3_53=0    ;DS.L 1            = 4
  102. sp3_54=4    ;DS.B 8            = 8
  103. sp3_55=12    ;DS.W 2*64        = 256
  104. sp3_56=268    ;DS.W 2 / DS.B 1    = 5
  105. sp3_57=273    ;DS.B 1    / DS.B 2*64    = 129
  106. sp3_58=402    ;DS.B 512        = 512
  107. sp3_SIZE=914
  108.  
  109. unpack:    moveq    #0,d0
  110.     ;movem.l d0-a6,-(sp)
  111.     ;lea    sp3_53(pc),a6
  112.     lea    -sp3_SIZE(sp),sp
  113.     move.l    sp,a6
  114.  
  115.     movea.l    a0,a1
  116.     cmpi.l    #'SPv3',(a1)+
  117.     bne.s    sp3_02
  118.     tst.w    (a1)
  119.     bne.s    sp3_02
  120.     move.l    (a1)+,d5    ; magic number only
  121.     move.l    (a1)+,d0    ; d0 = packed length
  122.     move.l    (a1)+,-(sp)    ; (sp) = unpacklen [and there's a bug fixed]
  123.     movea.l    a0,a2        ; a2 = start of packed buffer
  124.     adda.l    d0,a0        ; a0 = end of packed buffer
  125.  
  126.     move.l    -(a0),-(a1)    ; overwrite header with last 16
  127.     move.l    -(a0),-(a1)    ; bytes of packed buffer.
  128.     move.l    -(a0),-(a1)
  129.     move.l    -(a0),-(a1)
  130.  
  131.     adda.l    (sp),a1        ; a1 = end of unpacked buffer
  132.  
  133.     lea    sp3_58-sp3_53(a6),a3
  134.     moveq    #128-1,d0    ; copy first 512 bytes of packed data
  135. sp3_01:    move.l    (a2)+,(a3)+    ; into sp_58 buffer
  136.     dbf    d0,sp3_01
  137.  
  138.     suba.l    a2,a3
  139.     move.l    a3,-(sp)
  140.     bsr.s    sp3_03
  141.     bsr    sp3_21
  142.     move.b    -(a0),d0
  143.     adda.l    (sp)+,a0
  144.     move.b    d0,(a0)+
  145.     lea    sp3_58-sp3_53(a6),a2
  146.     bsr    sp3_22
  147.     bsr    sp3_15
  148. sp3_02:
  149.     lea    sp3_SIZE+4(sp),sp
  150.     ;movem.l (sp)+,d0-a6
  151.     rts
  152.  
  153. sp3_03:    ;move.w    SR,d1
  154.     ;andi.w    #$2000,d1
  155.     ;beq.s    sp3_04
  156.     ;move.w    $FFFF8240.W,2(a6)
  157.     ;btst    #1,$FFFF8260.W
  158.     ;bne.s    sp3_04
  159.     ;swap    d5
  160. sp3_04:    ;clr.w    d5
  161.     move.w    -(a0),d6
  162.     lea    sp3_54-sp3_53(a6),a3
  163.     move.b    d6,(a3)+
  164.     moveq    #1,d3
  165.     moveq    #6,d4
  166. sp3_05:    cmp.b    d6,d3
  167.     bne.s    sp3_06
  168.     addq.w    #2,d3
  169. sp3_06:    move.b    d3,(a3)+
  170.     addq.w    #2,d3
  171.     dbf    d4,sp3_05
  172.     moveq    #$10,d4
  173.     move.b    -(a0),(a3)+
  174.     move.b    d4,(a3)+
  175.     move.b    -(a0),(a3)+
  176.     move.b    d4,(a3)+
  177.     move.b    -(a0),d4
  178.     move.w    d4,(a6)
  179.     lea    sp3_57-sp3_53(a6),a5
  180.     move.b    -(a0),d4
  181.     lea    1(a5,d4.w),a3
  182. sp3_07:    move.b    -(a0),-(a3)
  183.     dbf    d4,sp3_07
  184.     move.b    -(a0),-(a3)
  185.     beq.s    sp3_08
  186.     suba.w    d4,a0
  187. sp3_08:    moveq    #0,d2
  188.     move.b    -(a0),d2
  189.     move.w    d2,d3
  190.     move.b    -(a0),d7
  191. sp3_09:    bsr.s    sp3_10
  192.     bsr.s    sp3_10
  193.     dbf    d2,sp3_09
  194.     rts
  195.  
  196. sp3_10:    not.w    d4
  197.     add.b    d7,d7
  198.     bne.s    sp3_11
  199.     move.b    -(a0),d7
  200.     addx.b    d7,d7
  201. sp3_11:    bcs.s    sp3_12
  202.     move.w    d2,d0
  203.     subq.w    #1,d3
  204.     sub.w    d3,d0
  205.     add.w    d0,d0
  206.     add.w    d4,d0
  207.     add.w    d0,d0
  208.     neg.w    d0
  209.     move.w    d0,-(a3)
  210.     rts
  211. sp3_12:    moveq    #2,d1
  212.     bsr    sp3_44
  213.     add.w    d0,d0
  214.     beq.s    sp3_13
  215.     move.b    d0,-(a3)
  216.     moveq    #2,d1
  217.     bsr    sp3_44
  218.     add.w    d0,d0
  219.     move.b    d0,-(a3)
  220.     rts
  221. sp3_13:    moveq    #2,d1
  222.     bsr    sp3_44
  223.     move.w    sp3_55-sp3_53(a6),d1
  224.     add.w    d0,d0
  225.     beq.s    sp3_14
  226.     move.w    sp3_55+2-sp3_53(a6),d1
  227. sp3_14:    or.w    d1,d0
  228.     move.w    d0,-(a3)
  229.     rts
  230.  
  231. sp3_15:    clr.w    d1
  232.     ;move.w    SR,d1
  233.     ;andi.w    #$2000,d1
  234.     ;beq.s    sp3_16
  235.     ;move.w    2(a6),$FFFF8240.W
  236. sp3_16:    tst.w    d6
  237.     bpl.s    sp3_20
  238.     movea.l    a1,a2
  239.     movea.l    a1,a3
  240.     adda.l    4(sp),a3
  241.  
  242. sp3_17:    moveq    #3,d6
  243. sp3_18:    move.w    (a2)+,d0
  244.     moveq    #3,d5
  245. sp3_19:    add.w    d0,d0
  246.     addx.w    d1,d1
  247.     add.w    d0,d0
  248.     addx.w    d2,d2
  249.     add.w    d0,d0
  250.     addx.w    d3,d3
  251.     add.w    d0,d0
  252.     addx.w    d4,d4
  253.     dbf    d5,sp3_19
  254.     dbf    d6,sp3_18
  255.     cmpa.l    a2,a3
  256.     blt.s    sp3_20
  257.     movem.w    d1-d4,-8(a2)
  258.     cmpa.l    a2,a3
  259.     ;bne.s    sp3_17    ; you don't wanna do that!
  260.     bcc.s    sp3_17
  261. sp3_20:    rts
  262.  
  263. sp3_21:    move.b    -(a0),-(a1)
  264. sp3_22:    ;swap    d5
  265.     ;beq.s    sp3_23
  266.     ;move.w    d5,$FFFF8240.W
  267. sp3_23:    lea    sp3_56+2-sp3_53(a6),a3
  268.     cmpa.l    a0,a2
  269.     blt.s    sp3_25
  270.     rts
  271.  
  272. sp3_24:    adda.w    d3,a3
  273. sp3_25:    add.b    d7,d7
  274.     bcc.s    sp3_28
  275.     beq.s    sp3_27
  276. sp3_26:    move.w    (a3),d3
  277.     bmi.s    sp3_24
  278.     bra.s    sp3_29
  279. sp3_27:    move.b    -(a0),d7
  280.     addx.b    d7,d7
  281.     bcs.s    sp3_26
  282. sp3_28:    move.w    -(a3),d3
  283.     bmi.s    sp3_24
  284. sp3_29:    ext.w    d3
  285.     jmp    sp3_30(pc,d3.w)
  286. sp3_30:    bra.s    sp3_30
  287.     bra.s    sp3_41
  288.     bra.s    sp3_41
  289.     bra.s    sp3_41
  290.     bra.s    sp3_41
  291.     bra.s    sp3_41
  292.     bra.s    sp3_37
  293.     bra.s    sp3_36
  294.     bra.s    sp3_32
  295.     bra.s    sp3_33
  296.     bra.s    sp3_31
  297.     bra.s    sp3_34
  298.     bra.s    sp3_21
  299. sp3_31:    move.b    (a5),-(a1)
  300.     bra.s    sp3_22
  301. sp3_32:    bsr.s    sp3_43
  302.     move.b    1(a5,d0.w),-(a1)
  303.     bra.s    sp3_22
  304. sp3_33:    bsr.s    sp3_43
  305.     add.w    (a6),d0
  306.     move.b    1(a5,d0.w),-(a1)
  307.     bra.s    sp3_22
  308. sp3_34:    moveq    #3,d1
  309.     bsr.s    sp3_44
  310.     lsr.w    #1,d0
  311.     bcc.s    sp3_35
  312.     not.w    d0
  313. sp3_35:    move.b    (a1),d1
  314.     add.w    d0,d1
  315.     move.b    d1,-(a1)
  316.     bra.s    sp3_22
  317. sp3_36:    lea    sp3_52-2(pc),a4        ;-sp3_53(a6),a4
  318.     bsr.s    sp3_48
  319.     addi.w    #16,d0
  320.     lea    1(a1,d0.w),a3
  321.     move.b    -(a3),-(a1)
  322.     move.b    -(a3),-(a1)
  323.     bra    sp3_22
  324. sp3_37:    moveq    #3,d1
  325.     bsr.s    sp3_44
  326.     tst.w    d0
  327.     beq.s    sp3_38
  328.     addq.w    #5,d0
  329.     bra.s    sp3_40
  330. sp3_38:    move.b    -(a0),d0
  331.     beq.s    sp3_39
  332.     addi.w    #20,d0
  333.     bra.s    sp3_40
  334. sp3_39:    moveq    #13,d1
  335.     bsr.s    sp3_44
  336.     addi.w    #276,d0
  337. sp3_40:    move.w    d0,d3
  338.     add.w    d3,d3
  339. sp3_41:    lea    sp3_52(pc),a4        ;-sp3_53(a6),a4
  340.     bsr.s    sp3_48
  341.     lsr.w    #1,d3
  342.     lea    1(a1,d0.w),a3
  343.     move.b    -(a3),-(a1)
  344. sp3_42:    move.b    -(a3),-(a1)
  345.     dbf    d3,sp3_42
  346.     bra    sp3_22
  347. sp3_43:    moveq    #0,d1
  348.     move.b    (a3),d1
  349. sp3_44:    moveq    #0,d0
  350.     cmpi.w    #7,d1
  351.     bpl.s    sp3_47
  352. sp3_45:    add.b    d7,d7
  353.     beq.s    sp3_46
  354.     addx.w    d0,d0
  355.     dbf    d1,sp3_45
  356.     rts
  357. sp3_46:    move.b    -(a0),d7
  358.     addx.b    d7,d7
  359.     addx.w    d0,d0
  360.     dbf    d1,sp3_45
  361.     rts
  362. sp3_47:    move.b    -(a0),d0
  363.     subq.w    #8,d1
  364.     bpl.s    sp3_45
  365.     rts
  366. sp3_48:    moveq    #0,d1
  367.     move.b    (a3),d1
  368.     adda.w    d1,a4
  369.     move.w    (a4),d1
  370.     bsr.s    sp3_44
  371.     tst.b    d6
  372.     beq.s    sp3_51
  373.     move.w    d0,d4
  374.     andi.w    #$FFF0,d4
  375.     andi.w    #$000F,d0
  376.     beq.s    sp3_50
  377.     lsr.w    #1,d0
  378.     beq.s    sp3_49
  379.     roxr.b    #1,d7
  380.     bcc.s    sp3_50
  381.     move.b    d7,(a0)+
  382.     moveq    #-128,d7
  383.     bra.s    sp3_50
  384. sp3_49:    moveq    #2,d1
  385.     bsr.s    sp3_44
  386.     add.w    d0,d0
  387.     or.w    d4,d0
  388.     bra.s    sp3_51
  389. sp3_50:    lea    sp3_54-sp3_53(a6),a3
  390.     or.b    (a3,d0.w),d4
  391.     move.w    d4,d0
  392. sp3_51:    add.w    18(a4),d0
  393.     rts
  394.  
  395.     DC.W    3
  396. sp3_52:    DC.W    4,5,7,8,9,10,11,12
  397.     DC.W    -16
  398.     DC.W    0,32,96,352,864,1888,3936,8032
  399.  
  400. ;sp3_53:    DS.L    1
  401. ;sp3_54:    DS.B    8
  402. ;sp3_55:    DS.W    2*64
  403. ;sp3_56:    DS.W    2
  404. ;    DS.B    1
  405. ;sp3_57:    DS.B    1
  406. ;    DS.B    2*64
  407. ;sp3_58:    DS.B    512
  408.  
  409. SP3data_name    dc.b    '(SPv3) Data Cruncher',0
  410.         dc.b    '$VER: SPv3 1.1 (25.07.2000) by <kyzer@4u.net>'
  411.